<?php
/**
 * 见表cate_mix各字段解释
 * pid1&pid2为组合Primary Key
 * 
 * 几种情况下使用本类：
 * 1，需要两个PID选择出一个固定的list，此时pid1,pid2,type=0,hid会用到
 * 2，在一个list中，通过pids选择几个元素做为list输出，此时pid1,pid2,type=1,hid待选list的ID,value逗号间隔的hid列表
 * 3，pid2=0时也可以，以上1/2的pid2都可=0
 *
 * 做为条件查询和保存时pid1和pid2顺序按大/小排列，避免对pid1/2进行双次索引
 */
class CateMix
{
	/**
	 * 取cate_mix记录
	 */
	public static function get($pid1, $pid2)
	{
		return Db::get('CateMix')->select()->where(self::pidsKey($pid1, $pid2))->getOne();
	}

	/**
	 * 取mix指定列表
	 */
	public static function getMix($pid1, $pid2)
	{
		$rec	= self::get($pid1,$pid2);
		if(!$rec) return array();
		if($rec['type']==0){
			return Cate::getByPid($rec['hid']);
		}
		else{
			return Db::get('Cate')->select()->where(sprintf('hid IN (%s)',$rec['value']))->hkey('hid')->getAll();
		}
	}

	/**
	 * pid1&pid2 做为搜索条件时应可互换
	 */
	public static function pidsKey($pid1, $pid2, $getroots=false)
	{
		if($getroots)
		{
			$ext	= array();
			$ext['r1'] = $pid1 ? self::_getRootCateID($pid1) : 0;
			$ext['r2'] = $pid2 ? self::_getRootCateID($pid2) : 0;
			if($ext['r1']==$ext['r2']){
				return false;
			}
			return $pid1 > $pid2
					? array('pid1'=>$pid1,'pid2'=>$pid2,'r1'=>$ext['r1'],'r2'=>$ext['r2'])
					: array('pid1'=>$pid2,'pid2'=>$pid1,'r1'=>$ext['r2'],'r2'=>$ext['r1']);
		}
		else{
			return $pid1 > $pid2
					? array('pid1'=>$pid1,'pid2'=>$pid2)
					: array('pid1'=>$pid2,'pid2'=>$pid1);
		}
	}
	private static function _getRootCateID($child_id)
	{
		return Db::get('Cate')->select('pid')->where(array('hid'=>$child_id))->getCol();
	}

	/**
	 * 增加固定mix记录
	 */
	public static function addFix($pid1,$pid2,$hid)
	{
		if(!($t = self::pidsKey($pid1, $pid2, true))){
			return false;
		}
		if($hid==$t['r1'] || $hid==$t['r2']){
			return false;
		}
		return Db::get('CateMix')->insert(array_merge(
				$t, array('type'=>0,'hid'=>$hid)
			))->exec();
	}

	/**
	 * 增加选择型mix记录
	 */
	public static function addLink($pid1,$pid2,$hid,$value)
	{
		if(!($t = self::pidsKey($pid1, $pid2, true))){
			return false;
		}
		if($hid==$t['r1'] || $hid==$t['r2']){
			return false;
		}
		return Db::get('CateMix')->insert(array_merge(
				$t, array('type'=>1,'hid'=>$hid, 'value'=>$value)
			))->exec();
	}

	public static function getList($s=0,$l=0)
	{
		return Db::get(__CLASS__)->select()->limit($s,$l)->order('pid1 ASC,pid2 ASC,hid ASC')->getAll();
	}

	/**
	 * 删除
	 */
	public static function delete($pid1, $pid2)
	{
		return Db::get(__CLASS__)->delete()->where(self::pidsKey($pid1, $pid2))->exec();
	}
	
}
?>
